package com.yubest.demo;

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;

import java.io.*;
import java.util.List;

/**
 * @Author hweiyu
 * @Description
 * @Date 2021/8/12 9:35
 */
public class CompressUtil {

    public static void main(String[] args) throws Exception {
        String path = "D:\\0001-converted.zip";
        ZipFile zipFile = new ZipFile(path);
        if (zipFile.isEncrypted()) {
            zipFile.setPassword("1234567".toCharArray());
        }
        List<FileHeader> fileHeaders = zipFile.getFileHeaders();

        for(FileHeader fileHeader : fileHeaders) {
            try {
                InputStream is = zipFile.getInputStream(fileHeader);
                byte[] b = new byte[1024];
                while (is.read(b) != -1) {
                    //Do nothing as we just want to verify password
                }
                is.close();
            } catch (ZipException e) {
                System.out.println(ZipException.Type.WRONG_PASSWORD == e.getType());

            } catch (IOException e) {
                System.out.println("Most probably wrong password.");
                e.printStackTrace();
            }
        }
    }

//    public static void unZip(File srcFile, String destDirPath) throws Exception {
//        // 判断源文件是否存在
//        if (!srcFile.exists()) {
//            return;
//        }
//        if (srcFile.getName().endsWith(".7z")) {
//            un7z(srcFile, destDirPath);
//            return;
//        }
//        if (srcFile.getName().endsWith(".rar")) {
//            unRar(srcFile, destDirPath);
//            return;
//        }
//        long start = System.currentTimeMillis();
//        // 开始解压
//        ZipFile zipFile = null;
//        try {
//            zipFile = new ZipFile(srcFile);
//            Enumeration<?> entries = zipFile.entries();
//
//            while (entries.hasMoreElements()) {
//                ZipEntry entry = (ZipEntry) entries.nextElement();
//                System.out.println("解压" + entry.getName());
//                // 如果是文件夹，就创建个文件夹
//                if (entry.isDirectory()) {
//                    String dirPath = destDirPath + "/" + entry.getName();
//                    File dir = new File(dirPath);
//                    dir.mkdirs();
//                } else {
//                    // 如果是文件，就先创建一个文件，然后用io流把内容copy过去
//                    File targetFile = new File(destDirPath + "/" + entry.getName());
//                    // 保证这个文件的父文件夹必须要存在
//                    if (!targetFile.getParentFile().exists()) {
//                        targetFile.getParentFile().mkdirs();
//                    }
//                    targetFile.createNewFile();
//                    // 将压缩文件内容写入到这个文件中
//                    InputStream is = zipFile.getInputStream(entry);
//                    FileOutputStream fos = new FileOutputStream(targetFile);
//                    int len;
//                    byte[] buf = new byte[4096];
//                    while ((len = is.read(buf)) != -1) {
//                        fos.write(buf, 0, len);
//                    }
//                    // 关流顺序，先打开的后关闭
//                    fos.close();
//                    is.close();
//                }
//            }
//            long end = System.currentTimeMillis();
//            System.out.println("解压完成，耗时：" + (end - start) + " ms");
//        } catch (Exception e) {
//            throw new RuntimeException("unzip error from ZipUtils", e);
//        } finally {
//            if (zipFile != null) {
//                try {
//                    zipFile.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//
//    public static void un7z(File srcFile, String destDirPath) throws Exception {
//        /**
//         * zip解压
//         * @param inputFile 待解压文件名
//         * @param destDirPath  解压路径
//         */
//        // 判断源文件是否存在
//        if (!srcFile.exists()) {
//            throw new Exception(srcFile.getPath() + "所指文件不存在");
//        }
//        //开始解压
//        SevenZFile zIn = new SevenZFile(srcFile);
//        SevenZArchiveEntry entry = null;
//        File file = null;
//        while ((entry = zIn.getNextEntry()) != null) {
//            if (!entry.isDirectory()) {
//                file = new File(destDirPath, entry.getName());
//                if (!file.exists()) {
//                    new File(file.getParent()).mkdirs();//创建此文件的上级目录
//                }
//                OutputStream out = new FileOutputStream(file);
//                BufferedOutputStream bos = new BufferedOutputStream(out);
//                int len = -1;
//                byte[] buf = new byte[1024];
//                while ((len = zIn.read(buf)) != -1) {
//                    bos.write(buf, 0, len);
//                }
//                // 关流顺序，先打开的后关闭
//                bos.close();
//                out.close();
//            }
//        }
//    }
//
//    public static void unRar(File rarFile, String outDir) throws Exception {
//        Archive archive = new Archive(new FileInputStream(rarFile));
//        FileHeader fileHeader = archive.nextFileHeader();
//        while (fileHeader != null) {
//            if (fileHeader.isDirectory()) {
//                fileHeader = archive.nextFileHeader();
//                continue;
//            }
//            File out = new File(outDir, fileHeader.isUnicode() ? fileHeader.getFileNameW() : fileHeader.getFileNameString());
//            if (!out.exists()) {
//                new File(out.getParent()).mkdirs();//创建此文件的上级目录
//            }
//            FileOutputStream os = new FileOutputStream(out);
//            archive.extractFile(fileHeader, os);
//
//            os.close();
//
//            fileHeader = archive.nextFileHeader();
//        }
//        archive.close();
//    }
}
